//aula12

package com.thecherno.game;

import com.thecherno.game.graphics.Screen;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
import javax.swing.JFrame;

public class Main extends Canvas implements Runnable{
    private static final long serialVersionUID = 1L;
    
    static int width = 300,
               height = width / 16 * 9,//168
               scale = 3;
    
    private Thread thread;
    private JFrame frame;
    private boolean running = false;
    
    private Screen screen;
    
    private BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
    //conversão de uma imagem em um array de pixels. o vetor é a forma de acesso à imagem
    private int[] pixels = ((DataBufferInt)image.getRaster().getDataBuffer()).getData();
    
    public Main(){
        Dimension size = new Dimension(width*scale, height*scale);
        setPreferredSize(size);
        screen = new Screen(width, height);
        frame = new JFrame();
    }
    
    public static void main(String[] args){
        Main game = new Main();
        game.frame.setResizable(false);
        game.frame.setTitle("Rain");
        game.frame.add(game);//adiciona canvas ao jframe
        game.frame.pack();//jframe do mesmo damanho do conteudo(canvas)
        game.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        game.frame.setLocationRelativeTo(null);//centraliza frame
        game.frame.setVisible(true);
        
        game.start();
    }
    
    public void run(){
        while(running){
            update();
            render();
        }
    }
    
    public synchronized void start(){
        running = true;
        thread = new Thread(this, "Display");
        thread.start();
    }
    
    public synchronized void stop(){
        running = false;
        try{
            thread.join();
        }
        catch(InterruptedException ex){
            ex.printStackTrace();
        }
    }
    
    public void update(){
        //
    }
    
    public void render(){
        BufferStrategy bs = getBufferStrategy();
        if(bs == null){
            createBufferStrategy(3);
            return;
        }
        
        screen.clear();//limpa a tela
        //geração dos novos pixel para compor a tela
        screen.render();
        
        //cópia nos novos pixels para o vetor de pixels desta classe
        for(int i=0; i<pixels.length; i++){
            //de alguma forma, modificar o vetor pixels modifica o objeto image
            pixels[i] = screen.pixels[i];
        }
        
        Graphics g = bs.getDrawGraphics();
        //adição de gráficos
        g.setColor(Color.BLACK);//adicionar cor preta
        g.fillRect(0, 0, getWidth(), getHeight());//retangulo do tamanho da tela
        //adiciona os pixels gerados em screen.render() na imagem
        g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
        g.dispose();
        bs.show();//mostra a imagem criada. troca de buffers
    }
}
